#include <iostream>
//#include <stdlib.h> // 使用C语言的标准库函数，包含相应的头文件
#include <cstdlib>    // C++针对C的标准库进行优化
#include <ctime>
#include <cstring>

using namespace std;

#define ARR_SIZE 5

typedef struct {
	char name[32];
	float price;
	int amount;
}Drinks;

enum drink_info{NAME, PRICE, AMOUNT};

void assin_array(int *ptr, int n);
void output_array(int *ptr, int n);
void sort_array(int *ptr, int n);

void assin_array(Drinks *ptr, int n);
void output_array(Drinks *ptr, int n);
void sort_array(Drinks *ptr, int n, enum drink_info info = PRICE); // 函数参数指定默认值

int main()
{
	//int array[1024 * 1024] = {1,2,3,4,5}; // 数组空间在栈区,linux下，进程中栈区最大为8M
	//int *array = (int *)malloc(sizeof(int) * 10); // 从堆中分配内存
	//int *pi = new int; // 从堆中分配一个int类型空间
	//int *pi = new int(5); // 空间分配后，对空间赋值
	
	srand(time(NULL));
	
	// 定义数组指针，并为其申请空间
	//int *array = new int[ARR_SIZE];
	Drinks *array = new Drinks[ARR_SIZE];
	
	if (array == NULL) {
		cout << "malloc failed" << endl;
		return 0;
	}
	
	assin_array(array, ARR_SIZE); 	// 数组赋值(随机)
	output_array(array, ARR_SIZE); 	// 遍历数组输出
	sort_array(array, ARR_SIZE);  	// 排序
	output_array(array, ARR_SIZE); 	// 输出
	
	sort_array(array, ARR_SIZE, AMOUNT);  	// 排序
	output_array(array, ARR_SIZE); 	// 输出
	//free(array);
	//delete pi;
	delete [] array;
	
	return 0;
}

/*
函数功能：对指定整型数组，赋值为随机值
函数参数：int *ptr,指向数组首元素，int n,指定元素个数
函数返回:无
*/
void assin_array(int *ptr, int n)
{
	for (int i = 0;i < n;i++) {
		//cin >> array[i];
		ptr[i] = rand() % 100;
	}
}
const char names[ARR_SIZE][32] = {"可乐","娃哈哈","雪碧","脉动","红牛"};
void assin_array(Drinks *ptr, int n)
{
	for (int i = 0;i < n;i++) {
		//cin >> array[i];
		strcpy(ptr[i].name, names[i]);
		ptr[i].price = (rand() % 100 + 1) * 0.1;
		ptr[i].amount = rand() % 100;
	}
}

/*
函数功能：遍历输出
*/
void output_array(int *ptr, int n)
{
	cout << "raw data:\n";
	for (int i = 0;i < ARR_SIZE;i++) {
		cout << ptr[i] << ",";
	}
	cout << endl;
}

void output_array(Drinks *ptr, int n)
{
	cout << "raw data:\n";
	for (int i = 0;i < ARR_SIZE;i++) {
		cout << ptr[i].name << " " << ptr[i].amount << " " << ptr[i].price << endl;
	}
}

/*
函数功能：交换两个整型变量的值
*/
void swap_val(int *a, int *b)
{
	auto t = *a;
	*a = *b;
	*b = t;
}
void swap_val(int &a, int &b)
{
	auto t = a;
	a = b;
	b = t;
}
void swap_val(Drinks &a, Drinks &b)
{
	auto t = a;
	a = b;
	b = t;
}
/*
函数功能：冒泡排序
*/
void sort_array(int *ptr, int n)
{
	int i, j, t;
	for (i = 0;i < n - 1; i++) {
		for (j = 0; j < n - 1 - i; j++) {
			if (ptr[j] > ptr[j + 1]) { 			// 比较
				swap_val(ptr[j], ptr[j + 1]);	// 交换
				//swap_val(ptr + j, ptr + j + 1);
			}
		}
	}
}

void sort_array(Drinks *ptr, int n, enum drink_info info)
{
	int i, j, t;
	for (i = 0;i < n - 1; i++) {
		for (j = 0; j < n - 1 - i; j++) {
			switch (info) {
				case PRICE:
					if (ptr[j].price > ptr[j + 1].price) { 			// 比较
						swap_val(ptr[j], ptr[j + 1]);	// 交换
						//swap_val(ptr + j, ptr + j + 1);
					}
				break;
				case AMOUNT:
					if (ptr[j].amount > ptr[j + 1].amount) { 			// 比较
						swap_val(ptr[j], ptr[j + 1]);	// 交换
						//swap_val(ptr + j, ptr + j + 1);
					}
				break;
				case NAME:
				break;
			}
		}
	}
}
